/*
 * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。
 * 
 * 欢迎到知启蒙网站（https://www.zhiqim.com）购买正版软件，知启蒙还提供许多开源框架和软件。
 * 
 * 1、本软件产品所有源代码受《中华人民共和国著作权法》和其他有关法律、法规的保护，其所有知识产权归湖南知启蒙科技有限公司所有；
 * 2、禁止复制和修改。不得复制修改、翻译或改编本软件所有源代码，或者基于本软件产品创作衍生作品；
 * 3、禁止进行逆向工程。不得对本软件的源代码进行逆向工程、反编译或试图以其他方式发现软件的源代码；
 * 4、个别授权：如需进行商业性的销售、复制、分发，包括但不限于软件销售、预装、捆绑等，必须获得知启蒙的书面授权和许可；
 * 5、保留权利：本注释未明示授权的其他一切权利仍归知启蒙所有，任何人使用其他权利时必须获得知启蒙的书面同意。
*/
package net.redxyz.repost.service.task.tmc;

import java.util.List;

import org.zhiqim.kernel.json.Jsons;
import org.zhiqim.kernel.logging.Log;
import org.zhiqim.kernel.logging.LogFactory;
import org.zhiqim.kernel.schedule.Task;
import org.zhiqim.kernel.util.Validates;
import org.zhiqim.kernel.util.mutables.MInt;
import org.zhiqim.orm.ORM;

import net.redxyz.repost.service.dao.TmcDao;
import net.redxyz.top.TaobaoService;
import net.redxyz.top.data.tmc.TmcMessage;
import net.redxyz.top.dbo.sys.SysTmcCat;
import net.redxyz.top.dbo.sys.SysTmcTopic;
import net.redxyz.top.message.tmc.TmcMessagesConsumeResponse20439_21986;

/**
 * 获取全部TMC消息，根据一级分类进行分拣，每分钟执行一次
 *
 * @version v1.0.0 @author zouzhigang 2014-3-21 新建与整理
 */
public class TmcTask implements Task
{
    private static final Log log = LogFactory.getLog(TmcTask.class);
    private static final Log messageLog = LogFactory.getLog("message.interface.log");
    private static final String NAME = "[TMC分拣]";
    
    public void execute()
    {
        log.info(NAME + "开始...");
        
        List<SysTmcCat> catList;
        List<SysTmcTopic> topicList;
        
        try
        {
            //先把TMC分类和主题加载一次（这里暂不做缓存）
            catList = ORM.table().list(SysTmcCat.class);
            topicList = ORM.table().list(SysTmcTopic.class);
        }
        catch(Exception e)
        {
            log.error(NAME + "数据库异常", e);
            return;
        }
        
        MInt total = new MInt();
        MInt failNum = new MInt();
        while(true)
        {
            TmcMessagesConsumeResponse20439_21986 resp = TaobaoService.getTmcService().getMessage(100);
            if (!resp.isSuccess())
            {
                log.error(NAME + "淘宝接口异常："+resp.getErrorMsg());
                return;
            }
            
            if (resp.isEmpty())
            {
                if (total.value == 0)
                    log.info(NAME + "结束，没有新的消息，等待下次查询");
                else
                    log.info(NAME + "结束，共查到["+total+"]个消息，处理失败["+failNum+"]个");
                return;
            }
            
            total.value += resp.size();
            log.info(NAME + "本次查到["+resp.size()+"]个消息");
            
            
            StringBuilder sMessageIds = new StringBuilder();
            List<TmcMessage> messageList = resp.getMessageList();
            for(TmcMessage message : messageList)
            {//逐个消息处理
                process(message, failNum, sMessageIds, catList, topicList);
            }
            
            //不管成功失败，统一成功提交到淘宝端
            sMessageIds.setLength(sMessageIds.length()-1);
            TaobaoService.getTmcService().confirmMessage(sMessageIds.toString(), "");
            
            if (resp.size() < 100)
            {
                log.info(NAME + "结束，共查到["+total+"]个消息，处理失败["+failNum+"]个");
                break;
            }
        }
    }
    
    /** 逐个消息处理 */
    private void process(TmcMessage message, MInt failNum, StringBuilder sMessageIds, List<SysTmcCat> catList, List<SysTmcTopic> topicList)
    {
        long id = message.getId();
        
        try
        {
            //1.判断是否是配置的一级分类
            String catId = getOneLevelCatId(message.getTopic(), catList, topicList);
            if (catId == null)
            {//一级分类未获取到，丢弃
                return;
            }
            
            //2.保存到对应的一级分类表中
            TmcDao.replace(catId, message.getId(), message.getUserNick(), message.getTopic(), message.getContent(), message.getPubTime());
        }
        catch(Exception e)
        {//出错的都记录到文件中
            failNum.value++;
            messageLog.info(Jsons.toString(message));
            log.error(NAME + "异常", e);
        }
        finally
        {
            sMessageIds.append(id).append(",");
        }
    }
    
    /** 获取一级分类ID */
    private String getOneLevelCatId(String topicId, List<SysTmcCat> catList, List<SysTmcTopic> topicList) throws Exception
    {
        if (Validates.isEmpty(topicId))
            return null;
        
        for (SysTmcTopic topic : topicList)
        {
            if (!topic.getTopicId().equals(topicId))
            {//不是该主题的继续查找
                continue;
            }
            
            if (topic.getTopicStatus() != 0)
            {//主题不是正常状态
                return null;
            }
                
            for (SysTmcCat cat : catList)
            {
                if (!cat.getCatId().equals(topic.getCatId()))
                {//不是该主题分类的继续查找
                    continue;
                }
                
                //该主题的分类、正常且是一级分类的，表示匹配成功，返回一级分类ID
                return (cat.getCatStatus() == 0 && cat.getCatLevel() == 1)?topic.getCatId():null;
            }
            
            //未匹配到分类
            return null;
        }
        
        //未匹配到主题
        return null;
    }
}
